/**
 * Projekt do předmetu GJA - LATEX TABLE CREATOR
 *
 * Soubor: ArrowButton.java
 *
 * @author Ondřej Klubal <xkluba00@stud.fit.vutbr.cz>
 * @author Petr Šimon    <xsimon10@stud.fit.vutbr.cz>
 */

package ArrowButton;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * Komponenta realizující tlačítko s šipkou
 * Kliknutím na šipku -> menu
 * Kliknitím na ikonu -> akce
 * Uvažuje se tlačítko s ikonou 16x16 pixelů. Text nelze použít!!!.
 */
public class ArrowButton extends JButton
{
     private GeneralPath arrow; //šipka
     int left = 0;
     private boolean firstTime = true; //detekce inicializace
     private boolean isRollover = false; //kurzor je nad tlačítkem
     
     /**
      * Konstruktor
      * @param ico  Hlavní ikona tlačítka (TEXT NEPOUŽÍVAT!!!!)
      */
     public ArrowButton(Icon ico)
     {
          super("   ", ico); //uděláme si místo na šipku
          addMouseListener(ml); //očetření "klikacích" událostí
          Dimension size = new Dimension(28, 24); //pevně dané rozměry
          this.setSize(size); //nsatavíme rozměry
          this.setMinimumSize(size);
          this.setMaximumSize(size);
          //this.setPreferredSize(size);
     }
     
     /**
      * Vykreslí tlačítko.
      * Nejprve je vykresleno snadartní tlačítko, pak je přes to doplněna svislá čára rozdělující tlačítko na oblast s ikonou a oblast s šipkou.
      * @param g     Odkaz na <code>Graphics</code>. Vykreslování.
      */
     @Override public void paint(Graphics g)
     {
          //vykreslíme klasické tlačítko
          super.paint(g);
          
          //uděláme si zálohu g
          Graphics2D g2 = (Graphics2D)g;
          
          //nastavíme vyhlazování
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          
          int h = getHeight(); //výška tlačítka
          float sx = 3f;       //mezera v horizontálním směru 3px
          
          double x = sx + this.getIcon().getIconWidth() + sx;
          
          if (isRollover) //reakce na přejezd myši -> obrazení oddělovací čáry
          {
               Insets margin = this.getMargin();
               g2.setPaint(UIManager.getColor("Button.darkShadow"));
               g2.draw(new Line2D.Double(x, margin.top + 1, x, h - margin.bottom - 2));
               g2.setPaint(UIManager.getColor("Button.light"));
               g2.draw(new Line2D.Double(x + 1, margin.top + 1, x + 1, h - margin.bottom - 2));
          }
          
          if (firstTime)  //vytvoříme šipku
          {
               arrow = new GeneralPath();
               arrow.moveTo(x + sx, 0.42*h);
               arrow.lineTo(x + sx + 6f, 0.42*h);
               arrow.lineTo(x + sx + 3f, 0.58*h);
               arrow.closePath();
               
               left = (int)x + 1;
               firstTime = false;
          }
          
          //vykreslí šipku
          g2.setPaint(UIManager.getColor("Button.foreground"));
          g2.fill(arrow);
     }
     
     
     /**
      * Metoda určená k Overridu. Sama o sobě nic nedělá.
      * Je volána při kliku na ikonu.
      */
     public void doAction() { }
     
     /**
      * Metoda určená k Overridu. Sama o sobě nic nedělá.
      * Je volána při kliku na šipku
      */
     public void doMenu() {  }
     
     /**
      * Předefinování události myší (click)
      */
     private MouseListener ml = new MouseAdapter()
     {
          /**
           * Kliknutí myší.
           * @param  evt událost (nevyužito)
           */
          @Override public void mousePressed(MouseEvent e)
          {
               if (e.getX() <= left) //detekce obsalsti
                    doAction();
               else
                    doMenu();
          }

          /**
           * Vstup myši
           * @param  evt událost (nevyužito)
           */
          @Override public void mouseEntered(MouseEvent e)
          {
               isRollover = true; repaint();
          }
          
          /**
           * Opuštění obasti
           * @param  evt událost (nevyužito)
           */
          @Override public void mouseExited(MouseEvent e)
          {
               isRollover = false; repaint();
          }
     };
}
